package cn.stard.zuul;

import com.alibaba.fastjson.JSON;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.apache.tomcat.util.json.JSONParser;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Component
public class ZuulFilter extends com.netflix.zuul.ZuulFilter {
    /*
     * @Title:
     * @Description: 拦截器方法因为zuul支持两种拦截器 "pre” “post”在返回这里直接配置就行了
     * @Author: Mr.She
     * @Version: 1.0
     * @Date:
     * @Parameters:
     * @Return
     */

    @Override
    public String filterType() {
        return "pre";
    }

    /*
     * @Title:
     * @Description: 设置拦截器执行优先级
     * @Author: Mr.She
     * @Version: 1.0
     * @Date:
     * @Parameters:
     * @Return
     */

    @Override
    public int filterOrder() {
        return 1;
    }

    /*
     * @Title:
     * @Description: 设置拦截器是否开启也就是run
     * @Author: Mr.She
     * @Version: 1.0
     * @Date:
     * @Parameters:
     * @Return
     */

    @Override
    public boolean shouldFilter() {

        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        System.out.println("获取当前请求指针"+request);
        String url = request.getRequestURI();
        System.out.println("获取当前指针的url地址"+url);
        // 获取当前请求的路径
        if (url.endsWith("/login")||url.endsWith("/register")||url.contains("/static/")){
            return false;
        }

        return true;
    }
    /*
     * @Title:
     * @Description: 设置拦截器核心方法
     * @Author: Mr.She
     * @Version: 1.0
     * @Date:
     * @Parameters:
     * @Return
     */

    @Override
    public Object run() throws ZuulException {


        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        String token = request.getHeader("token");
        //如果token有问题
        if(StringUtils.isBlank(token)&&!tokenIsTrue(token)){
            System.out.println("判断token是否为空这个方法还可以判断空格"+StringUtils.isBlank(token));

            System.out.println("自定义方法来验证token"+tokenIsTrue(token));
            // 登录失败的返回信息 先创建一个容器来装返回的数据
            Map result= new HashMap<>();
            // 添加需要返回的错误数据
            result.put("success",false);
            result.put("message","登录失败");
            result.put("code",402);
            result.put("data","数据错误");
            System.out.println("返回错误的数据集合"+result);
            // 因为前端解析参数是一个json数据所以需要转换格式
            String jsonresult= JSON.toJSONString(result);
            System.out.println("转换为json后的格式"+JSON.toJSONString(jsonresult));
            // 3.返回失败响应信息
            // 3.1 获取响应请求
            HttpServletResponse response = RequestContext.getCurrentContext().getResponse();
            System.out.println("响应指针"+response);
            // 登录错误响应码
            response.setStatus(402);
            // 3.2写入响应体里面
            try {
                response.getWriter().write(jsonresult);
                System.out.println("写入响应体指针"+response.getWriter());

            } catch (IOException e) {
                e.printStackTrace();
            }
            // 拦截本次请求
            RequestContext.getCurrentContext().setSendZuulResponse(false);
        }
        return null;
    }

    /*这里我们自定义了一个方法*/
    public Boolean tokenIsTrue(String token){

        return false;
    }


    public static void main(String[] args) {
        // 设置一个空格字符串
        String s = " ";
        // 打印看两个方法的效果
        System.out.println("isEmpty效果:"+StringUtils.isEmpty(s));
        System.out.println("isBlank效果:"+StringUtils.isBlank(s));
    }
}
